package com.qili.util;

import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;

import java.io.IOException;
import java.io.InputStream;
import java.util.*;

/**
 * @author liuyang
 * @date 2021/2/23
 * @description
 */
public class ExcelUtil {

    public static List<List> readXls3(InputStream input) {
        List<List> resultList = new ArrayList<List>();
        try {
            HSSFWorkbook wb = new HSSFWorkbook(input);
            HSSFSheet sheet = wb.getSheetAt(0); // 获得第一个表单
            Iterator<Row> rows = sheet.rowIterator();// 获得第一个表单的迭代器
            short cols = 1;
            while (rows.hasNext()) {
                List<String> thisRow = new ArrayList<String>();
                Row row = rows.next(); // 获得行数据
                System.out.println("xls：Row = " + row.getRowNum()); // 获得行号从0开始
                if (row.getRowNum() == 0) {
                    cols = row.getLastCellNum();
                }
                for (short j = 0; j < cols; j++) {
                    Cell cell = row.getCell(j);
                    String result = "";
                    if (cell != null) {
                        result = getStringVal(null, cell);
                    }
                    // System.out.println(result);
                    thisRow.add(leftTrimRight(result));
                }
                resultList.add(thisRow);
            }
        } catch (IOException ex) {
            ex.printStackTrace();
        }
        return resultList;
    }

    public static List<List> readXlsx3(InputStream input) {
        List<List> resultList = new ArrayList<List>();
        try {
            XSSFWorkbook wb = new XSSFWorkbook(input);
            Sheet sheet = wb.getSheetAt(0);// 获得第一个表单
            int cols = 1;
            Iterator<Row> rows = sheet.rowIterator(); // 获得第一个表单的迭代器
            while (rows.hasNext()) {
                List<String> thisRow = new ArrayList<String>();
                Row row = rows.next(); // 获得行数据
                // System.out.println("xlsx：Row = " + row.getRowNum());
                // //获得行号从0开始
                if (row.getRowNum() == 0) {
                    cols = row.getLastCellNum();
                    // System.out.println("cols = "+cols);
                }
                for (int j = 0; j < cols; j++) {
                    Cell cell = row.getCell(j);
                    String result = "";
                    if (cell != null) {
                        result = getStringVal(cell, null);
                    }
                    // System.out.println(result);
                    thisRow.add(leftTrimRight(result));
                }
                resultList.add(thisRow);
            }
        } catch (IOException ex) {
            ex.printStackTrace();
        }
        return resultList;
    }


    /*
     * 全部设置为String类型
     * @param cell
     * @return
     */
    private static String getStringVal(Cell cell, Cell cell2) {
        if (cell != null) {

            switch (cell.getCellType()) {
                case Cell.CELL_TYPE_NUMERIC:
                    cell.setCellType(Cell.CELL_TYPE_STRING);// 将number型的改为string类型，避免科学计数法
                    return cell.getStringCellValue();
                case Cell.CELL_TYPE_STRING:
                    return cell.getStringCellValue();
                case Cell.CELL_TYPE_BOOLEAN:
                    return (cell.getBooleanCellValue() + "");
                case Cell.CELL_TYPE_FORMULA:
                    return (cell.getCellFormula() + "");
                default:
                    return "";
            }
        } else {
            // hcell.setEncoding(HSSFCell.ENCODING_UTF_16);//解决乱码
            switch (cell2.getCellType()) {
                case HSSFCell.CELL_TYPE_NUMERIC:
                    cell2.setCellType(HSSFCell.CELL_TYPE_STRING);
                    return cell2.toString();
                case HSSFCell.CELL_TYPE_STRING:
                    return cell2.toString();
                case HSSFCell.CELL_TYPE_BOOLEAN:
                    return (cell2.getBooleanCellValue() + "");
                case HSSFCell.CELL_TYPE_FORMULA:
                    return (cell2.getCellFormula() + "");
                default:
                    return "";
            }
        }
    }

    /*
     * 去掉字符串两边的空格
     * @param str 要处理的字符串
     * @return 处理后的字符串
     */
    private static String leftTrimRight(String str) {
        if (str == null || str == "") {
            return "";
        }
        if (!str.matches("\\w")) {// 只要包含汉字就不做后续的处理
            return str;
        }
        int end = str.length();
        int start = 0;
        for (int i = end - 1; i >= 0; i--) {
            if (str.charAt(i) != 0x20) {
                break;
            }
            end--;
        }
        for (int i = 0; i < end; i++) {
            if (str.charAt(i) == 0x20) {
                start++;
            }
        }
        return str.substring(start, end);
    }


    /**
     * 用户角色上传
     * @param input
     * @return
     */
    public static List<Map<String,List<String>>> UserRolesreadXls3(InputStream input) {
        // 结果集
        List<Map<String,List<String>>> mapList = new ArrayList<>();
        try {
            HSSFWorkbook wb = new HSSFWorkbook(input);
            // 获得第一个表单
            HSSFSheet sheet = wb.getSheetAt(0);
            // 获得第一个表单的迭代器
            Iterator<Row> rows = sheet.rowIterator();
            short cols = 1;
            // 存放角色对应的编码
            List<String> roleCodelist = new ArrayList<>();
            while (rows.hasNext()) {
                // 结果集
                Map<String,List<String>> tempMap = new HashMap<>();
                // 获得行数据
                Row row = rows.next();
                // 获得行号从0开始
                System.out.println("xls：Row = " + row.getRowNum());
                // 0-表头；1-角色名称 【不需要，直接跳过】
                if (row.getRowNum() == 0 || row.getRowNum() == 1) {
                    continue;
                }else {
                    // 把一行的列数赋值
                    cols = row.getLastCellNum();
                }
                // 存放当前的遍历的用户
                String strUserName = null;
                // 存放当前用户拥有的角色编码
                List<String> tempList = new ArrayList<>();
                for (short j = 0; j < cols; j++) {
                    // 获取当前列对应的数据
                    Cell cell = row.getCell(j);
                    String result = "";
                    // 获取到的数据不能为空
                    if (null != cell){
                        // 当前获取到的数据转为string
                        result = getStringVal(cell, null);
                        if (!"".equals(result)){
                            // 角色编码一行 - 放进集合中就跳过本次循环
                            if (row.getRowNum() == 2){
                                roleCodelist.add(result);
                                continue;
                            }
                            // 用户唯一编码
                            if (j == 1){
                                strUserName = result;
                            }
                            // 用户对应的角色编码
                            if (j > 1){
                                // 不为空
                                tempList.add(roleCodelist.get(j-2));
                            }
                        }
                    }
                }
                // 当前用户的用户名和角色编码
                if (!StringUtil.isBlank(strUserName)){
                    tempMap.put(strUserName,tempList);
                }
                if (!tempMap.isEmpty()){
                    mapList.add(tempMap);
                }
            }
        } catch (IOException ex) {
            ex.printStackTrace();
        }
        return mapList;
    }

    /**
     * 用户角色导入
     * @param input
     * @return
     */
    public static List<Map<String,List<String>>> UserRolesReadXlsx(InputStream input){
        // 结果集
        List<Map<String,List<String>>> mapList = new ArrayList<>();
        try {
            XSSFWorkbook wb = new XSSFWorkbook(input);
            // 获得第一个表单
            Sheet sheet = wb.getSheetAt(0);
            // 获得第一个表单的迭代器
            Iterator<Row> rows = sheet.rowIterator();
            int cols = 1;
            // 存放角色对应的编码
            List<String> roleCodelist = new ArrayList<>();
            // 遍历Excel行数据
            while (rows.hasNext()) {
                Map<String,List<String>> tempMap = new HashMap<>();
                // 获得当前行数据
                Row row = rows.next();
                // 0-表头；1-角色名称 【不需要，直接跳过】
                if (row.getRowNum() == 0 || row.getRowNum() == 1) {
                    continue;
                }else {
                    // 把一行的列数赋值
                    cols = row.getLastCellNum();
                }
                String strUserName = null;
                // 存放当前用户拥有的角色编码
                List<String> tempList = new ArrayList<>();
                for (short j = 0; j < cols; j++) {
                    // 获取当前列对应的数据
                    Cell cell = row.getCell(j);
                    String result = "";
                    // 获取到的数据不能为空
                    if (null != cell){
                        // 当前获取到的数据转为string
                        result = getStringVal(cell, null);
                        if (!"".equals(result)){
                            // 角色编码一行 - 放进集合中就跳过本次循环
                            if (row.getRowNum() == 2){
                                roleCodelist.add(result);
                                continue;
                            }
                            // 用户唯一编码
                            if (j == 1){
                                strUserName = result;
                            }
                            // 用户对应的角色编码
                            if (j > 1){
                                // 不为空
                                tempList.add(roleCodelist.get(j-2));
                            }
                        }
                    }
                }
                // 当前用户的用户名和角色编码
                if (!StringUtil.isBlank(strUserName)){
                    tempMap.put(strUserName,tempList);
                }
                if (!tempMap.isEmpty()){
                    mapList.add(tempMap);
                }
            }
        }catch (IOException e){
            e.printStackTrace();
        }
        return mapList;
    }

}
